# 模型类必须继承自 django.db models
# 这个是django的 ORM(对象关系映射) 的核心设计
# ORM 是 将 对象(object) 面向对象编程中的类的实例 和 关系型数据库中的表进行相互转换的技术 

from django.db import models
# timezone是Django提供的时区处理工具，
# 用于获取当前时间（自动处理时区抓换）
# 时区转换和本地化 
from django.utils import timezone

# Create your models here.

# 编写数据表 数据表名称 -- 字段 -- 数据类型 -- 数据约束
# 数据表 --> 类名

# class ProductManager(models.Manager):
#     def create_product(self,product_name, cover, price):q
#         """自定义创建逻辑"""
#         product = self.model(product_name=product_name, cover=cover, price=price)
#         product.save()
#         return product
#     pass

# 定义模型 --> 数据库表
# 继承Model类
# ctrl + 鼠标左键 查看继承的源代码
class Product(models.Model):
    # 字段 --> 类属性 
    # 数据类型 --> 数据类型方法
    # 产品名称 unique=True 这个实例中的值不在其他实例创建的时候使用 唯一不重复的值
    product_name = models.CharField(max_length=21, unique=True, verbose_name="商品名称")
    # 商品封面
    # 专门用于图片上传的字段 upload_to:保存到服务器具体文件 images文件名称 
    cover = models.ImageField(upload_to="images",null=True,blank=True, verbose_name="封面图")
    # 商品价格 --> 不能写整数/浮点数 9.9 19.9 29.9 精度高
    # DecimalField 适合用于存储货币金额这类需要高精度的数据，
    # max_digits 数字的最大位数， 99999999.00，其中也包含小数点的部分
    # decimal_places 指定了小数点的位数，设置为，精确到小数点后两位, 9.90, 19.90, 19.00 20.00
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="价格")
    # 热度 0 100 1000
    popularity = models.IntegerField(default=0, verbose_name="热度/浏览量")

    # 库存管理
    stock  = models.IntegerField(verbose_name="库存")
    
    # 商品状态 通过布尔值控制 True False
    is_active = models.BooleanField(default=False, verbose_name="是否上架")
    # 创建时间 第一次保存数据的时候记录时间
    # 时间类型的字段 --> 日期时间(2025-5-5 20:21:00) --> 日期(2025-5-5)
    create_time = models.DateTimeField(default=timezone.now, verbose_name="创建时间")
    # 修改时间 每一次数据的变动都要记录时间
    # auto_now=True 自动记录字段的最后修改时间 每次调用save()方法时，字段会自动更新为当前时间
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    # 声明自定义管理器
    # objects = ProductManager()
    
    # product_product 
    class Meta:
        # 是Django模型的内部类
        # 作用：定义模型的元数据(metadata), 关于模型的数据，这些元数据不会直接影响数据库字段，但控制模型的各种行为和特性
        # 自定义数据库表名 db_table
        db_table = "product"
        verbose_name = "商品"
        # 指定模型对象复数形式
        verbose_name_plural = verbose_name
    
    def __str__(self):
        return f"商品名：{self.product_name}--状态{self.is_active}"

    # 给库存+10
    def add_stock(self):
        print("库存+10")
        return self.stock + 10

# 评论模型 把两张表如何关联起来？ 一个商品 多个评论 一对多关系 外键关联 创建一个专门的字段，product_id = Product 关联的模型的主键
class Review(models.Model):
    # 外键关联的字段 假设我的商品被删除了，评论怎么处理？ 一起被删除   on_delete=models.CASCADE 级联删除 商品被删除之后，评论也一起删除 
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name="商品")
    username = models.CharField(max_length=21,verbose_name="用户名")
    avater = models.ImageField(upload_to="review_user", verbose_name="用户头像")
    comment = models.TextField(verbose_name="评论内容")
    link_count = models.IntegerField(verbose_name="点赞量")
    create_tiem = models.DateTimeField(default=timezone.now, verbose_name="评论时间")
    update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
    
    class Meta:
        db_table = "review"
        verbose_name = "评论"
        verbose_name_plural = verbose_name
    
    def __str__(self):
        return self.comment



# Product.objects.create_product(product_name="小米13Pro", 
#                                cover="", 
#                                price=100)